<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>

    <script>

        ////////////////////////////////////////////////////////////////////////

        // 简单用法

        /*function plus(x, y) {
            return x + y;
        }

        function minus(x, y) {
            return x - y;
        }*/

        /*var n1 = plus.call(null, 3, 5);
        var n2 = minus.call(null, 8, 6);*/

        /*var n1 = plus.apply(null, [3, 4]);
        var n2 = minus.apply(null, [8, 5]);

        console.log("n1: " + n1);
        console.log("n2: " + n2);*/

        ////////////////////////////////////////////////////////////////////////

        // 实现继承
        /*function Fun1(name) {
            this.name = name;
            // this.color = color;
            this.getName = function() {
                return "the name is: " + this.name + ', color: ' + this.color;
            }
        }

        function Fun2(name, color) {
            this.name = name;
            this.color = color;
        }

        var f1 = new Fun1('aaa');
        // console.log(f1.getName());

        var f2 = new Fun2('bbb', 'gray');

        // var n1 = f1.getName.call(f2);
        var n1 = f1.getName.apply(f2);*/

        /*var name = f1.getName.call(f2);
        console.log(name);*/

        ////////////////////////////////////////////////////////////////////////

        // 实现多继承
        /*function Obj1() {
            this.getName = function() {
                return this.name;
            }
        }

        function Obj2() {
            this.sayHello = function() {
                return "Hello: " + this.name + ", Your age is: " + this.age;
            }
        }

        function Obj3() {
            this.name = "abc";
            this.age = 20;

            Obj1.call(this);
            Obj2.call(this);
        }

        var o3 = new Obj3();
        console.log(o3.getName());
        console.log(o3.sayHello());*/

        /*var fullname = 'May';
        var obj = {
            fullname: 'colin',
            prop: {
                fullname: 'rosa',
                getFullname: function() {
                    return this.fullname;
                }
            }
        };

        // console.log(obj.prop.getFullname());

        var test = obj.prop.getFullname;

        var r = test.call(obj.prop);

        console.log(r);*/

        // console.log(test());/**/

        // 如何让最后一个console.log()输出rosa

        // test.call(obj.prop);

    </script>

</body>
</html>

<!--
ECMAScript规范给所有函数都定义了call()与apply()两个方法，
call() 与 apply() 的第一个参数都是需要调用的函数对象，
在函数体内这个参数就是this的值，
剩余的参数是需要传递给函数的值（实参），
call() 与 apply() 的不同就是 call() 传的值是以逗号分隔的任意参数，
而 apply() 传的剩余值必须为数组。
-->
